#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#define IleParametrow 12
using namespace std;



	struct wine
	{
	//okreslenie koloru wina 0- niezdefiniowane 1 -czerwone, 2 -biale

		
		 enum ListaTypowKolorow{UNDEF,RED,WHITE};
		 enum ListaTypowPochodzenia{RANDOM,USER,ORYGINAL};
		//okreslenie czy rekord zostal dodany przez uzytkownika,oryginalny czy losowy,
		//czy pochodzi z pierwotnej bazy danych
	
		ListaTypowKolorow Kolor;
		ListaTypowPochodzenia CzyjRekord;
	
		
	float atrybuty[IleParametrow];
	wine()
	{
		for (int i=0;i<IleParametrow;i++)
		{
			atrybuty[i]=0;
		}
		Kolor=UNDEF;
		CzyjRekord=RANDOM;
	}

	#pragma  region winealt
		/*	double fixed_acidity;
		double volatile_acidity;
		double citric_acid;
		double residual_sugar;
		double chlorides;
		int free_sulfur_dioxide;
		int total_sulfur_dioxide;
		double density;
		double ph;
		double sulphates;
		double alcohol;
		int quality;
		*/
	/*
		ULAMKOWE fixed_acidity;
		ULAMKOWE volatile_acidity;
		ULAMKOWE citric_acid;
		ULAMKOWE residual_sugar;
		ULAMKOWE chlorides;
		CALKOWITE free_sulfur_dioxide;
		CALKOWITE total_sulfur_dioxide;
		ULAMKOWE density;
		ULAMKOWE ph;
		ULAMKOWE sulphates;
		ULAMKOWE alcohol;
		CALKOWITE quality;
	*/
	#pragma endregion
	};

	

 class base
{
private:
	bool FileReadyToGo,BaseReady;
	wine rec;
	ifstream odczyt;
	int AtrPrev;
	int SizePrev;
	vector<float> vec;
	
public:
	string NazwaPliku;
	vector<wine> rekordy;
	base()
	{
	 FileReadyToGo=false;
	 BaseReady=false;
	 
	}
	bool Drukuj()
	{
		if (FileReadyToGo)
		{
			for (int i=0;i<rekordy.size()-1;i++)
					{
						for (int j=0;j<IleParametrow;j++)
						{
							cout<<rekordy[i].atrybuty[j]<<";";
						}
						
					switch (rekordy[i].Kolor)
					{
					case 0:
						{
							cout<<"UNDEF;";
							break;
						}
					case 1:
						{cout<<"RED;";
							break;
			
						}
					case 2:
						{cout<<"WHITE;";
							break;
						}
					}
					switch (rekordy[i].CzyjRekord)
					{
					case 0:
						{cout<<"RANDOM;";
							break;
						}
					case 1:
						{cout<<"USER;";
							break;
			
						}
					case 2:
						{cout<<"ORYGINAL;";
							break;
						}
					}
						cout<<endl;
					}
			return true;
		} 
		else
		{
			return false;
		}
	}
	bool OdczytajPlik(const char * filename,wine::ListaTypowKolorow typwina)
	{
		vec.clear();
		NazwaPliku=filename;
		rec.Kolor=typwina;
		odczyt.open(filename,ifstream::in);
		rec.CzyjRekord=wine::ORYGINAL;
		FileReadyToGo=odczyt.good();
		return FileReadyToGo;
	}
	bool CzyscBaze()
	{
		vec.clear();
		BaseReady=false;
		FileReadyToGo=false;
		if (rekordy.size()==0)
		{
			return false;
		} 
		else
		{
			rekordy.clear();
			return true;
		}
		
	}
	bool UtworzBaze()
	{

		if (FileReadyToGo)
		{
			int substring_begin,substring_end;
			string temp,str;
		
				getline(odczyt,str);
			while(!odczyt.eof())
				{
					getline(odczyt,str);
					substring_end=str.find(";");
					temp=str.substr(0,substring_end);
					rec.atrybuty[0]=atof(temp.c_str());
		
		
					for (int i=1;i<IleParametrow-1;i++)
					{
						substring_begin=substring_end;
						substring_end=str.find(";",substring_begin+1);
						temp=str.substr(substring_begin+1,substring_end-substring_begin);
						rec.atrybuty[i]=atof(temp.c_str());
					}
					substring_begin=substring_end;
					
					temp=str.substr(substring_begin+1);
					rec.atrybuty[IleParametrow-1]=atof(temp.c_str());
					rekordy.push_back(rec);
				}
			BaseReady=true;
			

		} 
			else
			{BaseReady=false;
				
			}
		odczyt.close();
		FileReadyToGo=false;
		return BaseReady;
		
	}
	
	bool ZapiszNaDysku(const  char * filename)
	{
		return true;
	}

	bool DodajRekord(
		float FixedAcidity,
		float VolatileAcidity,
		float CitricAcid,
		float ResidualSugar,
		float Chlorides,
		float FreeSulfurDioxide,
		float TotalSulfurDioxide,
		float Density,
		float pH,
		float Sulphates,
		float Alcohol,
		float Quality,
		wine::ListaTypowKolorow typwina
					)
	{
			wine temp;
			temp.atrybuty[0]=FixedAcidity;
			temp.atrybuty[1]=VolatileAcidity;
			temp.atrybuty[2]=CitricAcid;
			temp.atrybuty[3]=ResidualSugar;
			temp.atrybuty[4]=Chlorides;
			temp.atrybuty[5]=FreeSulfurDioxide;
			temp.atrybuty[6]=TotalSulfurDioxide;
			temp.atrybuty[7]=Density;
			temp.atrybuty[8]=pH;
			temp.atrybuty[9]=Sulphates;
			temp.atrybuty[10]=Alcohol;
			temp.atrybuty[11]=Quality;
			temp.Kolor=typwina;
			temp.CzyjRekord=wine::USER;
			rekordy.push_back(temp);

	}


	
	
	 const  float * operator[](int atr)
	{
		
		float *wsk=new float[rekordy.size()];
		
		for(int i=0;i<rekordy.size()-1;i++)
		{
		wsk[i]=rekordy[i].atrybuty[atr];
		}
		
	
		return wsk;
	}
};